Esplora la Web Crypto API, un potente strumento per eseguire operazioni crittografiche direttamente nel browser. Scopri hashing, crittografia, firme e gestione delle chiavi con esempi pratici.
Web Crypto API: Una guida completa alle operazioni crittografiche
La Web Crypto API è un'API JavaScript che consente agli sviluppatori di eseguire operazioni crittografiche direttamente nel browser. Questo apre nuove possibilità per la creazione di applicazioni web sicure senza fare affidamento sull'elaborazione lato server per attività sensibili. Questo articolo fornisce una panoramica completa della Web Crypto API, coprendo le sue funzionalità chiave, i casi d'uso e le best practice.
Introduzione alla crittografia nel browser
Tradizionalmente, le operazioni crittografiche venivano gestite principalmente lato server a causa di problemi di sicurezza e dei limiti di JavaScript lato client. Tuttavia, la Web Crypto API fornisce un modo sicuro e standardizzato per eseguire attività crittografiche direttamente nel browser. Ciò consente una serie di nuove funzionalità, come la crittografia lato client, l'autenticazione sicura e le firme digitali, il tutto senza trasmettere dati sensibili al server inutilmente.
Un importante vantaggio della crittografia lato client è la riduzione del carico del server. Scaricando i calcoli crittografici sul browser, il server può concentrarsi su altri compiti, migliorando le prestazioni complessive dell'applicazione. Inoltre, la crittografia lato client può migliorare la privacy dell'utente garantendo che i dati sensibili vengano crittografati prima che lascino il dispositivo dell'utente.
Concetti fondamentali della Web Crypto API
La Web Crypto API si basa sui seguenti concetti fondamentali:
- Algoritmi di crittografia: L'API supporta vari algoritmi di crittografia, tra cui crittografia simmetrica (ad esempio, AES), crittografia asimmetrica (ad esempio, RSA), algoritmi di hashing (ad esempio, SHA-256) e algoritmi di firma digitale (ad esempio, ECDSA).
- Chiavi: Le operazioni crittografiche spesso richiedono delle chiavi. La Web Crypto API fornisce meccanismi per generare, importare, esportare e archiviare le chiavi in modo sicuro. Le chiavi possono essere simmetriche (utilizzate sia per la crittografia che per la decrittografia) o asimmetriche (composte da una chiave pubblica e una chiave privata).
- Interfaccia SubtleCrypto: L'interfaccia
SubtleCryptoè il punto di ingresso principale per l'accesso alle funzioni crittografiche. Fornisce metodi per eseguire hashing, crittografia, decrittografia, firma e verifica. - Promise: Tutte le operazioni crittografiche nella Web Crypto API sono asincrone e restituiscono promise. Ciò garantisce che l'interfaccia utente del browser rimanga reattiva durante l'esecuzione di attività crittografiche potenzialmente dispendiose in termini di tempo.
Algoritmi crittografici supportati
La Web Crypto API supporta un'ampia gamma di algoritmi crittografici. Ecco alcuni dei più comunemente usati:
Crittografia simmetrica
- AES (Advanced Encryption Standard): Un algoritmo di crittografia simmetrica ampiamente utilizzato. La Web Crypto API supporta le modalità AES-CBC, AES-CTR, AES-GCM e AES-KW.
Crittografia asimmetrica
- RSA (Rivest-Shamir-Adleman): Un popolare algoritmo di crittografia asimmetrica. La Web Crypto API supporta gli schemi di padding RSA-OAEP e RSA-PSS.
- ECDSA (Elliptic Curve Digital Signature Algorithm): Un algoritmo di firma asimmetrico basato sulla crittografia a curva ellittica.
- ECDH (Elliptic Curve Diffie-Hellman): Un protocollo di accordo chiave basato sulla crittografia a curva ellittica.
Algoritmi di hashing
- SHA-256 (Secure Hash Algorithm 256-bit): Un algoritmo di hashing ampiamente utilizzato che produce un valore hash a 256 bit.
- SHA-384 (Secure Hash Algorithm 384-bit): Un algoritmo di hashing che produce un valore hash a 384 bit.
- SHA-512 (Secure Hash Algorithm 512-bit): Un algoritmo di hashing che produce un valore hash a 512 bit.
Operazioni crittografiche di base
Esploriamo alcune operazioni crittografiche di base utilizzando la Web Crypto API con esempi di codice.
Hashing
L'hashing è il processo di trasformazione dei dati in una stringa di caratteri a dimensione fissa (un valore hash). L'hashing viene utilizzato per controlli di integrità dei dati, archiviazione delle password e indicizzazione.
async function hashData(data) {
const encoder = new TextEncoder();
const dataBuffer = encoder.encode(data);
const hashBuffer = await crypto.subtle.digest('SHA-256', dataBuffer);
const hashArray = Array.from(new Uint8Array(hashBuffer));
const hashHex = hashArray
.map((b) => b.toString(16).padStart(2, '0'))
.join('');
return hashHex;
}
// Example usage:
hashData('Hello, world!')
.then((hash) => console.log('SHA-256 Hash:', hash))
.catch((err) => console.error('Hashing error:', err));
Generazione di chiavi simmetriche
Le chiavi simmetriche vengono utilizzate per la crittografia e la decrittografia con la stessa chiave. La Web Crypto API consente di generare chiavi simmetriche utilizzando il metodo generateKey().
async function generateAESKey() {
return await crypto.subtle.generateKey(
{
name: 'AES-GCM',
length: 256,
},
true, // extractable
['encrypt', 'decrypt'] // usages
);
}
// Example usage:
generateAESKey()
.then((key) => {
console.log('AES Key generated:', key);
// Use the key for encryption/decryption
})
.catch((err) => console.error('Key generation error:', err));
Crittografia dei dati
La crittografia è il processo di trasformazione dei dati in un formato illeggibile per proteggere la loro riservatezza. Ecco un esempio di crittografia dei dati utilizzando AES-GCM:
async function encryptData(key, data) {
const encoder = new TextEncoder();
const dataBuffer = encoder.encode(data);
const iv = crypto.getRandomValues(new Uint8Array(12)); // Initialization vector
const encryptedData = await crypto.subtle.encrypt(
{
name: 'AES-GCM',
iv: iv,
},
key,
dataBuffer
);
// Combine IV and encrypted data for storage/transmission
const combined = new Uint8Array(iv.length + encryptedData.byteLength);
combined.set(iv, 0);
combined.set(new Uint8Array(encryptedData), iv.length);
return combined;
}
// Example usage (assuming you have an AES key):
generateAESKey().then(key => {
encryptData(key, 'Sensitive data')
.then((encrypted) => {
console.log('Encrypted data:', encrypted);
})
.catch((err) => console.error('Encryption error:', err));
});
Decrittografia dei dati
La decrittografia è il processo di trasformazione dei dati crittografati nel loro formato originale e leggibile. Ecco un esempio di decrittografia dei dati crittografati con AES-GCM:
async function decryptData(key, combined) {
const iv = combined.slice(0, 12);
const encryptedData = combined.slice(12);
const decryptedData = await crypto.subtle.decrypt(
{
name: 'AES-GCM',
iv: iv,
},
key,
encryptedData
);
const decoder = new TextDecoder();
return decoder.decode(decryptedData);
}
// Example usage (assuming you have the AES key and encrypted data):
generateAESKey().then(key => {
encryptData(key, 'Sensitive data').then(encrypted => {
decryptData(key, encrypted)
.then((decrypted) => {
console.log('Decrypted data:', decrypted);
})
.catch((err) => console.error('Decryption error:', err));
});
});
Generazione di chiavi asimmetriche
Le chiavi asimmetriche sono composte da una chiave pubblica e una chiave privata. La chiave pubblica può essere condivisa con altri, mentre la chiave privata deve essere mantenuta segreta. La Web Crypto API supporta la generazione di chiavi asimmetriche utilizzando il metodo generateKey().
async function generateRSAKey() {
return await crypto.subtle.generateKey(
{
name: 'RSA-OAEP',
modulusLength: 2048, // The length of the key in bits
publicExponent: new Uint8Array([0x01, 0x00, 0x01]), // Commonly 65537
hash: 'SHA-256',
},
true, // extractable
['encrypt', 'decrypt'] // usages
);
}
// Example usage:
generateRSAKey()
.then((keyPair) => {
console.log('RSA Public Key:', keyPair.publicKey);
console.log('RSA Private Key:', keyPair.privateKey);
// Use the keys for encryption/decryption
})
.catch((err) => console.error('Key generation error:', err));
Firma dei dati
Le firme digitali vengono utilizzate per verificare l'autenticità e l'integrità dei dati. Il mittente firma i dati con la propria chiave privata e il destinatario verifica la firma con la chiave pubblica del mittente.
async function signData(privateKey, data) {
const encoder = new TextEncoder();
const dataBuffer = encoder.encode(data);
const signature = await crypto.subtle.sign(
{
name: 'RSASSA-PKCS1-v1_5',
hash: { name: 'SHA-256' },
},
privateKey,
dataBuffer
);
return signature;
}
// Example usage (assuming you have an RSA key pair):
generateRSAKey().then(keyPair => {
signData(keyPair.privateKey, 'Data to sign')
.then((signature) => {
console.log('Signature:', signature);
})
.catch((err) => console.error('Signing error:', err));
});
Verifica delle firme
La verifica di una firma digitale conferma che i dati non sono stati manomessi e che sono stati effettivamente firmati dal mittente dichiarato.
async function verifySignature(publicKey, signature, data) {
const encoder = new TextEncoder();
const dataBuffer = encoder.encode(data);
const isValid = await crypto.subtle.verify(
{
name: 'RSASSA-PKCS1-v1_5',
hash: { name: 'SHA-256' },
},
publicKey,
signature,
dataBuffer
);
return isValid;
}
// Example usage (assuming you have the RSA key pair and the signature):
generateRSAKey().then(keyPair => {
signData(keyPair.privateKey, 'Data to sign').then(signature => {
verifySignature(keyPair.publicKey, signature, 'Data to sign')
.then((isValid) => {
console.log('Signature is valid:', isValid);
})
.catch((err) => console.error('Verification error:', err));
});
});
Gestione delle chiavi
Una corretta gestione delle chiavi è fondamentale per la sicurezza di qualsiasi sistema crittografico. La Web Crypto API fornisce meccanismi per generare, importare, esportare e archiviare le chiavi in modo sicuro. Tuttavia, l'archiviazione sicura delle chiavi nel browser può essere difficile.
Considerazioni sull'archiviazione delle chiavi
- IndexedDB: Un'opzione è quella di archiviare le chiavi in IndexedDB, un database NoSQL basato su browser. Tuttavia, IndexedDB non è specificamente progettato per l'archiviazione sicura delle chiavi, quindi è importante implementare misure di sicurezza aggiuntive, come la crittografia delle chiavi prima di archiviarle.
- LocalStorage/Cookies: Questi non sono generalmente raccomandati per l'archiviazione delle chiavi crittografiche a causa delle loro limitate funzionalità di sicurezza e del potenziale per gli attacchi cross-site scripting (XSS).
- Moduli di sicurezza hardware (HSM): In scenari più avanzati, è possibile utilizzare estensioni del browser o applicazioni native per interfacciarsi con i moduli di sicurezza hardware (HSM) per l'archiviazione sicura delle chiavi e le operazioni crittografiche.
Importazione ed esportazione delle chiavi
La Web Crypto API consente di importare ed esportare le chiavi in vari formati, ad esempio:
- JWK (JSON Web Key): Un formato basato su JSON per la rappresentazione delle chiavi crittografiche.
- PKCS#8: Un formato standard per l'archiviazione delle chiavi private.
- SPKI (Subject Public Key Info): Un formato standard per l'archiviazione delle chiavi pubbliche.
L'importazione e l'esportazione delle chiavi possono essere utili per trasferire le chiavi tra sistemi diversi o per il backup delle chiavi.
Key Wrapping e Unwrapping
Il key wrapping è il processo di crittografia di una chiave con un'altra chiave (la chiave di wrapping). Questo può essere utilizzato per proteggere le chiavi mentre sono archiviate o trasmesse. La Web Crypto API supporta il key wrapping e l'unwrapping utilizzando algoritmi come AES-KW e RSA-OAEP.
Casi d'uso per la Web Crypto API
La Web Crypto API apre un'ampia gamma di possibilità per la creazione di applicazioni web sicure. Ecco alcuni casi d'uso comuni:
- Crittografia lato client: Crittografa i dati sensibili nel browser prima di inviarli al server. Questo può proteggere i dati da intercettazioni e accessi non autorizzati.
- Autenticazione sicura: Implementa meccanismi di autenticazione sicuri utilizzando firme digitali e protocolli di scambio di chiavi.
- Controlli di integrità dei dati: Utilizza algoritmi di hashing per verificare l'integrità dei dati scaricati dal server.
- Comunicazione sicura: Stabilisci canali di comunicazione sicuri utilizzando la crittografia e i protocolli di scambio di chiavi.
- Digital Rights Management (DRM): Implementa schemi DRM per proteggere i contenuti protetti da copyright.
- Gestione delle password: Implementa meccanismi sicuri di archiviazione e recupero delle password. Utilizzo di PBKDF2 per l'hashing delle password lato client prima di inviarle al server.
Considerazioni sulla sicurezza
Sebbene la Web Crypto API fornisca un potente strumento per la creazione di applicazioni web sicure, è importante essere consapevoli dei potenziali rischi per la sicurezza e seguire le best practice:
- Cross-Site Scripting (XSS): Gli attacchi XSS possono compromettere la sicurezza della tua applicazione e consentire agli aggressori di rubare dati sensibili, incluse le chiavi crittografiche. Proteggi la tua applicazione dagli attacchi XSS sanitizzando correttamente l'input dell'utente e utilizzando le policy di sicurezza dei contenuti (CSP).
- Attacchi Man-in-the-Middle (MITM): Gli attacchi MITM possono intercettare e modificare il traffico di rete, compromettendo potenzialmente la riservatezza e l'integrità dei dati. Proteggi la tua applicazione dagli attacchi MITM utilizzando HTTPS e verificando l'autenticità dei certificati del server.
- Attacchi side-channel: Gli attacchi side-channel sfruttano le informazioni trapelate durante le operazioni crittografiche, come variazioni temporali o consumo di energia, per recuperare chiavi segrete. La Web Crypto API è progettata per mitigare gli attacchi side-channel, ma è importante essere consapevoli di questo rischio e utilizzare le best practice per l'implementazione crittografica.
- Gestione delle chiavi: La gestione sicura delle chiavi è fondamentale per la sicurezza di qualsiasi sistema crittografico. Proteggi le tue chiavi da accessi non autorizzati e assicurati che vengano archiviate e gestite in modo sicuro.
- Selezione dell'algoritmo: Scegli algoritmi crittografici e dimensioni delle chiavi appropriati per i tuoi requisiti di sicurezza. Evita di utilizzare algoritmi deboli o obsoleti. Consulta esperti di sicurezza per determinare i migliori algoritmi per la tua applicazione.
- Aggiornamenti regolari: Mantieni il tuo browser e le librerie JavaScript aggiornati con le ultime patch di sicurezza. Le vulnerabilità in questi componenti possono compromettere la sicurezza della tua applicazione.
Best practice per l'utilizzo della Web Crypto API
Ecco alcune best practice per l'utilizzo della Web Crypto API:
- Utilizza HTTPS: Utilizza sempre HTTPS per proteggere la tua applicazione dagli attacchi MITM.
- Sanifica l'input dell'utente: Sanifica correttamente l'input dell'utente per prevenire attacchi XSS.
- Utilizza le policy di sicurezza dei contenuti (CSP): Utilizza le CSP per limitare le risorse che la tua applicazione può caricare, mitigando il rischio di attacchi XSS.
- Scegli algoritmi forti: Seleziona algoritmi crittografici e dimensioni delle chiavi forti che siano appropriati per i tuoi requisiti di sicurezza.
- Implementa una gestione sicura delle chiavi: Implementa pratiche di gestione sicura delle chiavi per proteggere le tue chiavi da accessi non autorizzati.
- Mantieni il tuo software aggiornato: Mantieni il tuo browser e le librerie JavaScript aggiornati con le ultime patch di sicurezza.
- Testa a fondo la tua applicazione: Testa a fondo la tua applicazione per identificare e correggere potenziali vulnerabilità di sicurezza.
- Considera una libreria di crittografia: Sebbene la Web Crypto API sia potente, l'utilizzo di una libreria di crittografia ben collaudata (come TweetNaCl.js o CryptoJS) può fornire maggiore sicurezza e praticità. Queste librerie gestiscono spesso i dettagli di basso livello e i casi limite, riducendo il rischio di errori.
Esempi di Web Crypto API in azione
Consideriamo un paio di esempi reali in cui la Web Crypto API può essere utilizzata per migliorare la sicurezza e la privacy:
Applicazione di messaggistica sicura
Un'applicazione di messaggistica sicura può utilizzare la Web Crypto API per crittografare i messaggi lato client prima di inviarli al server. Ciò garantisce che solo il destinatario previsto possa leggere i messaggi, anche se il server è compromesso. Gli utenti potrebbero generare coppie di chiavi, crittografare i messaggi con la chiave pubblica del destinatario e firmare i messaggi con la propria chiave privata. Il destinatario utilizzerebbe quindi la propria chiave privata per decrittografare il messaggio e verificare la firma del mittente con la propria chiave pubblica.
Archiviazione sicura dei file
Un'applicazione di archiviazione sicura dei file può utilizzare la Web Crypto API per crittografare i file lato client prima di caricarli sul server. Ciò protegge i file da accessi non autorizzati, anche se il server è compromesso. Gli utenti potrebbero generare chiavi di crittografia, crittografare i file con queste chiavi e quindi archiviare in modo sicuro i file crittografati insieme alle chiavi (magari avvolgendo le chiavi per una maggiore protezione). Quando un utente desidera accedere a un file, l'applicazione recupererebbe il file crittografato e la chiave corrispondente, decrittograferebbe il file lato client e quindi lo visualizzerebbe per l'utente.
Argomenti avanzati
Oltre alle nozioni di base, la Web Crypto API offre diverse funzionalità avanzate per casi d'uso speciali:
- Funzioni di derivazione delle chiavi (KDF): Le KDF vengono utilizzate per derivare chiavi crittografiche da password o altri valori segreti. La Web Crypto API supporta PBKDF2 (Password-Based Key Derivation Function 2), una KDF ampiamente utilizzata per la derivazione delle chiavi basata su password.
- Crittografia autenticata: Gli algoritmi di crittografia autenticata, come AES-GCM e ChaCha20-Poly1305, forniscono sia riservatezza che integrità. Crittografano i dati e generano anche un tag di autenticazione che può essere utilizzato per verificare l'integrità dei dati.
- Crittografia a curva ellittica (ECC): ECC è un tipo di crittografia asimmetrica basata su curve ellittiche. La Web Crypto API supporta ECDSA (Elliptic Curve Digital Signature Algorithm) ed ECDH (Elliptic Curve Diffie-Hellman), che vengono comunemente utilizzati per firme digitali e scambio di chiavi.
Conclusione
La Web Crypto API fornisce un modo potente e standardizzato per eseguire operazioni crittografiche direttamente nel browser. Ciò consente agli sviluppatori di creare applicazioni web sicure senza fare affidamento sull'elaborazione lato server per attività sensibili. Comprendendo i concetti fondamentali della Web Crypto API, seguendo le best practice ed essendo consapevoli dei potenziali rischi per la sicurezza, puoi sfruttare questo potente strumento per migliorare la sicurezza e la privacy delle tue applicazioni web. Man mano che le applicazioni web diventano sempre più sofisticate e gestiscono dati più sensibili, la Web Crypto API svolgerà un ruolo sempre più importante nel garantire la sicurezza e la privacy del web.